/////////////////////////////////////////////////////////////////////////
////                        Conversor Analogo Digital                ////
////                         por: Rommel Contreras                   ////
////                             rommel@udo.edu.ve                   ////
////                     http://ciencia.digital.info.ve              ////
////                                                                 ////
////                 CCS     ver 1.0 Mayo -  2015                    ////
////                 CCS     ver 2.0 Octubre 2017                    ////
////                  Para capturar datos del Geofono SM-6           ////
////           Visualizar datos con "Visor_Geofono" en Processing    ////
////          Original para Feria de Ciencia Regional Oriente 2015   ////
/////////////////////////////////////////////////////////////////////////

#include <18F25K20.h>

#fuses XT,PUT,NOWDT,NOPROTECT,NOBROWNOUT

#device ADC = 10             // 8 o 10-bit conversion, con presicion < 0.1%
                             // presicion [(1/1024) * 100%] = 0,09765625%

//#device ICD=TRUE          // Solo para debug
//#define	DEBUGGING_ON    // solo para debug

#define Baudios  19200      // Velocidad de transmision fina hasta 57600
#define P_corte    100      // 100 ok, Retardo antes de enviar el nuevo dato
#use delay(clock = 4M)

#use    rs232(baud=Baudios, parity=N, xmit=PIN_C6, rcv=PIN_C7, stream=OUT)

#include <flex_lcd.c>		// Manejo LCD: Permite usar diversos puertos y pines
//variables globales
   int16 analin;            // Usar para 16 bits
//   int analin;            //      para 8 bits
   int canal;
// long f_escala;
   float vref;

// Funcion para inicializar el conversor AD
 void init_adc()
{
    // Utilizar la referencia de voltaje adecuada VSS_a_referencia
    //	setup_adc_ports(sAN0|sAN1|sAN4|VSS_VDD);
    //	setup_adc_ports(sAN2|VSS_VDD);
        setup_adc_ports(sAN2|VSS_VREF);  // Voltaje referencia = 2.56 V
    //	setup_adc(ADC_CLOCK_DIV_2|ADC_TAD_MUL_8);
        setup_adc(ADC_CLOCK_DIV_4);
    //  setup_adc(ADC_CLOCK_INTERNAL);
        read_adc(ADC_START_AND_READ);
}

// Para implementar otro tipo de conversor analogo/digital.
// Por ejemplo un volt�metro multicanal.
// Funcion para leer el valor analogico y hacer la conversion
// se le pasa el canal y el factor de escala (f_escala)
/*
 void lee_adc(int canal)
    {
        set_adc_channel(canal);
        delay_us(10);
        analin[canal] = read_adc(); 					//Get input byte
      //analin[canal] = (analin[canal])/ f_escala;      //Para convertir
    }
*/

//Funcion principal: Inicializa el LCD y el ADC
//llama a las funciones o subrrutinas necesarias
//Despliega en el LCD los resultados de la adqusicion ADC
void main() //*************************************************
{
    setup_adc_ports(0x40000);	    //Ping sAN2 analogo
  	set_tris_a(0b00001100);  		// RA3 y RA2 se configurna como entradas
    
	vref = 2.56;
	lcd_init();
	delay_ms(6);
	init_adc();
	delay_ms(10);
	lcd_putc ("\fGeofono v.2.0");
	lcd_putc ("\n  2019 MPLAB X");
	delay_ms(1000);
	lcd_putc ("\f");
    lcd_gotoxy(1,1);
    printf(lcd_putc,"Conversor A/\D");
    lcd_gotoxy(1,2);
    printf(lcd_putc,"V= %Lu",Baudios);        
    lcd_gotoxy(10,2);
    printf(lcd_putc,"%Lu us",P_corte);
    
    while(TRUE ){

            set_adc_channel(2);
            delay_us(5);
            analin = read_adc();
            delay_us(5);

               printf("%LX\n",(analin));// Se�al del sensor en canal; 2 hexa long
               delay_us(P_corte);       // Fino para 40 us; usar 19200 Baudios
         
    }
}


// Para implementar otro tipo de conversor analogo/digital.
// Por ejemplo un volt�metro multicanal.
/*
             // lcd_gotoxy(1,2);
            // printf(lcd_putc,"%Lu %c", (vref * analin/1023),0);
            // fputc((vref * analin[0]/1023),OUT);

            /// lcd_gotoxy(1,2);
            /// printf(lcd_putc,"%Lu\n",(analin));
            ///    analin = 0x3FF;
 
             ///   printf("%X\n",0x20);
            ///   delay_ms( 300 );
            ///   lcd_putc ("\f");
 */